home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / net / ds5000.md / netLEMach.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  4KB  |  134 lines

  1. /* 
  2.  * netLEMach.c --
  3.  *
  4.  *    Machine dependent routines for the LANCE driver. 
  5.  *
  6.  * Copyright 1990 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/net/ds5000.md/netLEMach.c,v 1.3 92/06/03 22:48:32 voelker Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #include <sprite.h>
  21. #include <sys.h>
  22. #include <list.h>
  23. #include <netInt.h>
  24. #include <netLEInt.h>
  25. #include <vm.h>
  26. #include <vmMach.h>
  27. #include <mach.h>
  28. #include <machMon.h>
  29. #include <dbg.h>
  30. #include <assert.h>
  31.  
  32.  
  33. /*
  34.  *----------------------------------------------------------------------
  35.  *
  36.  * NetLEMachInit --
  37.  *
  38.  *    Verify that the interface exists and set up the machine dependent
  39.  *    state.
  40.  *
  41.  * Results:
  42.  *    SUCCESS if the LANCE controller was found and initialized,
  43.  *    FAILURE otherwise.
  44.  *
  45.  * Side effects:
  46.  *    Initializes the netEtherFuncs record, as well as the chip.
  47.  *
  48.  *----------------------------------------------------------------------
  49.  */
  50.  
  51. ReturnStatus
  52. NetLEMachInit(interPtr, statePtr)
  53.     Net_Interface    *interPtr;     /* Network interface. */
  54.     NetLEState        *statePtr;    /* State structure. */
  55. {
  56.     char        *slotAddr;
  57.     int         i;
  58.     List_Links        *itemPtr;
  59.     short         value = NET_LE_CSR0_ADDR;
  60.     char        *romPtr;
  61.     char        buffer[32];
  62.     ReturnStatus     status;
  63.     int            slot;
  64.     Mach_SlotInfo    slotInfo;
  65.     static char        *vendor = "DEC";
  66.     static char        *module = "PMAD-AA";
  67.  
  68.     slot = (int) interPtr->ctrlAddr;
  69.     slotAddr = (char *) MACH_IO_SLOT_ADDR(slot);
  70.  
  71.  
  72.     statePtr->regPortPtr = (volatile NetLE_Reg *) (slotAddr + 
  73.     NET_LE_MACH_RDP_OFFSET);
  74.     /*
  75.      * Check that the device is exists and is a LANCE interface. 
  76.      */
  77.     status = Mach_GetSlotInfo(slotAddr + NET_LE_MACH_DIAG_ROM_OFFSET, 
  78.             &slotInfo);
  79.     if (status != SUCCESS) {
  80.     return status;
  81.     }
  82.     if (strcmp(slotInfo.vendor, vendor) || strcmp(slotInfo.module, module)) {
  83.     return FAILURE;
  84.     }
  85.     /*
  86.      * Read out the Ethernet address. 
  87.      */
  88.     romPtr = (char *) (slotAddr + NET_LE_MACH_ESAR_OFFSET + 2);
  89.     for (i = 0; i < 6; i++, romPtr += 4) {
  90.     ((char *) &statePtr->etherAddress)[i] = *romPtr;
  91.     }
  92.  
  93.     Mach_SetIOHandler(slot, Net_Intr, (ClientData) interPtr);
  94.     statePtr->bufAddr = ((char *) slotAddr) + NET_LE_MACH_BUFFER_OFFSET;
  95.     statePtr->bufAllocPtr = statePtr->bufAddr + 0x4000;
  96.     statePtr->bufSize = NET_LE_MACH_BUFFER_SIZE - 0x4000;
  97.     (void) Net_EtherAddrToString(&statePtr->etherAddress, buffer);
  98.     interPtr->name = module;
  99.     printf("Ethernet in slot %d, address %s (%s %s %s %s)\n",
  100.     slot,buffer, interPtr->name, vendor, slotInfo.revision, slotInfo.type);
  101.     return (SUCCESS);
  102. }
  103.  
  104. /*
  105.  *----------------------------------------------------------------------
  106.  *
  107.  * NetLEMemAlloc --
  108.  *
  109.  *    Allocates memory in the network buffer.
  110.  *
  111.  * Results:
  112.  *    Address of the allocated region.
  113.  *
  114.  * Side effects:
  115.  *    None.
  116.  *
  117.  *----------------------------------------------------------------------
  118.  */
  119.  
  120. char *
  121. NetLEMemAlloc(statePtr, size)
  122.     NetLEState        *statePtr;    /* State of the interface. */
  123.     int            size;        /* Amount to allocate. */
  124. {
  125.     Address        start;
  126.     if ((int) statePtr->bufAllocPtr + size > statePtr->bufSize) {
  127.     panic("NetLEBufAlloc: out of memory\n");
  128.     }
  129.     start = statePtr->bufAllocPtr;
  130.     statePtr->bufAllocPtr += size;
  131.     return start;
  132. }
  133.  
  134.